package cn.jpush.phonegap;


import android.app.ActivityManager;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Bundle;
import android.util.Log;

import com.mingyi.MainActivity;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cn.jpush.android.api.JPushInterface;

public class MyReceiver extends BroadcastReceiver {
	//public AudioManager mAudioManager;

	private static String TAG = "JPushPlugin";
	@Override
	public void onReceive(Context context, Intent intent) {

        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
			Bundle bundle = intent.getExtras();
			String title = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);


//        }else if (JPushInterface.ACTION_UNREGISTER.equals(intent.getAction())){
        	
        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
			/*
			 * 保存服务器推送下来的消息的标题。
			 *对应 API 消息内容的 title 字段。
			 *对应 Portal 推送消息界面上的“标题”字段（可选）. */

			Bundle bundle = intent.getExtras();
			String title = bundle.getString(JPushInterface.EXTRA_TITLE);

			/*保存服务器推送下来的消息内容。
			对应 API 消息内容的 message 字段。
			对应 Portal 推送消息界面上的"消息内容”字段。 */
			String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);

			/*
			保存服务器推送下来的附加字段。这是个 JSON 字符串。
            对应 API 消息内容的 extras 字段。
            对应 Portal 推送消息界面上的“自定义内容”。
			 */
			String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);

			/*
			保存服务器推送下来的内容类型。
			对应 API 消息内容的 content_type 字段。
			 */
			String type = bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE);

			System.out.println("收到了自定义消息。消息内容是：" + bundle.getString(JPushInterface.EXTRA_MESSAGE));
			// 自定义消息不会展示在通知栏，完全要开发者写代码去处理(相当于信鸽的透传)
        	handlingReceivedMessage(intent);
        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
			/*
			保存服务器推送下来的通知的标题。
			对应 API 通知内容的 n_title 字段。
			对应 Portal 推送通知界面上的“通知标题”字段。
			 */
			Bundle bundle = intent.getExtras();
			String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
			/*
			保存服务器推送下来的通知内容。
			对应 API 通知内容的 n_content 字段。
			对应 Portal 推送通知界面上的“通知内容”字段。
			 */
			String content = bundle.getString(JPushInterface.EXTRA_ALERT);
			/*
			SDK 1.2.9 以上版本支持。
			保存服务器推送下来的附加字段。这是个 JSON 字符串。
			对应 API 通知内容的 n_extras 字段。
			对应 Portal 推送通知界面上的“自定义内容”字段
			 */
			String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
			/*
			SDK 1.3.5 以上版本支持。
			通知栏的Notification ID，可以用于清除Notification
			 */
			int notificationId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
			/*
			SDK 1.4.0 以上版本支持。
			富媒体通知推送下载的HTML的文件路径,用于展现WebView。
 			*/
			String fileHtml = bundle.getString(JPushInterface.EXTRA_RICHPUSH_HTML_PATH);

			System.out.println("收到了通知");
			System.out.println("收到了通知内容"+content+extras);
			// 在这里可以做些统计，或者做些其他工作
			//AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
		/*	 mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
			mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,0,0);*/
			/*if (!isApplicationBroughtToBackground(MainActivity.instance.getApplicationContext())) {

				Log.v("our", "前台运行");
				// notifiShowedRlt.
				NotificationManager mNotificationManager = (NotificationManager) MainActivity.instance
						.getApplicationContext().getSystemService(
								Context.NOTIFICATION_SERVICE);
				mNotificationManager.cancel(notificationId);
			} else {
				Log.v("our", "后台运行");
			}
*/			//MainActivity.instance.ToJS("push_receive.alert()");
			//MainActivity.instance.ToJS("pushReceive.receivedContent('"+extras+"')");
			MainActivity.instance.ToJS("push_receive.receiveNotification('"+extras+"')");
        	handlingNotificationReceive(context,intent);
        	
        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
			System.out.println("用户点击打开了通知");
			// 在这里可以自己写代码去定义用户点击后的行为
			/*Intent i = new Intent(context, TestActivity.class);  //自定义打开的界面
			i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			context.startActivity(i);*/
			/*
			保存服务器推送下来的通知的标题。
			对应 API 通知内容的 n_title 字段。
			对应 Portal 推送通知界面上的“通知标题”字段。
			 */
			Bundle bundle = intent.getExtras();
			String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
			/*
			SDK 1.3.5 以上版本支持。
			通知栏的Notification ID，可以用于清除Notification
			 */
			int notificationId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);


			//在这里回调js 把内容传到页面程序中通用的回调,

			System.out.println("yinggai huidiao");
			String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
			String content = bundle.getString(JPushInterface.EXTRA_ALERT);

//			MainActivity.instance.ToJS("pushReceive.alert()");
			//扩展信息

			MainActivity.instance.ToJS("pushReceive.openPanel('"+extras+"')");
		//	MainActivity.instance.ToJS("pushReceive.openPanel('"+content+"')");
       	handlingNotificationOpen(context, intent);
        } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
        
        } else {
        	Log.d(TAG, "Unhandled intent - " + intent.getAction());
        }
	
	}
	private void handlingReceivedMessage(Intent intent) {
		String msg = intent.getStringExtra(JPushInterface.EXTRA_MESSAGE);
		Map<String,Object> extras = getNotificationExtras(intent);
		
		
		JPushPlugin.transmitPush(msg, extras);
	}
	 private void handlingNotificationOpen(Context context,Intent intent){
		 Log.i(TAG, "----------------  handlingNotificationOpen");

		 String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT);
		 Map<String,Object> extras = getNotificationExtras(intent);
		 
		 Intent launch = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
		 launch.addCategory(Intent.CATEGORY_LAUNCHER);
		 launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
		 JPushPlugin.openNotificationAlert = alert;
		 JPushPlugin.openNotificationExtras = extras;
		 
		 JPushPlugin.transmitOpen(alert, extras);

		 context.startActivity(launch);
	 }
	 private void handlingNotificationReceive(Context context,Intent intent){

		 Log.i(TAG, "----------------  handlingNotificationReceive");

		 String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT);
		 Map<String,Object> extras = getNotificationExtras(intent);
		 
		 Intent launch = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
		 launch.addCategory(Intent.CATEGORY_LAUNCHER);
		 launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
		 
		 JPushPlugin.notificationAlert = alert;
		 JPushPlugin.notificationExtras = extras;
		 
		 JPushPlugin.transmitReceive(alert, extras);
	 }
	 private Map<String, Object> getNotificationExtras(Intent intent) {
		 Map<String, Object> extrasMap = new HashMap<String, Object>();
		 
		 for (String key : intent.getExtras().keySet()) {
			 if (!IGNORED_EXTRAS_KEYS.contains(key)) {
			    Log.e("key","key:"+key);
		     	if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)){
		     		extrasMap.put(key, intent.getIntExtra(key,0));
		     	}else{
		     		extrasMap.put(key, intent.getStringExtra(key));
		        }
			 }
		 }
		 return extrasMap;
	 }

	/*
 	 *系统控制声音和振动
	 */
/*	private void setRingerMode(boolean silent, boolean vibrate) {
		if (silent) {
			mAudioManager.setRingerMode(vibrate ? AudioManager.RINGER_MODE_VIBRATE :
					AudioManager.RINGER_MODE_SILENT);
		} else {
			mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
			mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
					vibrate ? AudioManager.VIBRATE_SETTING_ON
							: AudioManager.VIBRATE_SETTING_OFF);
		}
	}*/



	/*
	 *判断透传时application前后台的状态
	 * 需要权限:android.permission.GET_TASKS(允许一个程序获取信息有关当前或最近运行的任务，一个缩略的任务状态，是否活动等等)
	 */
	public boolean isApplicationBroughtToBackground(Context context) {
		ActivityManager am = (ActivityManager) context
				.getSystemService(Context.ACTIVITY_SERVICE);
		List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
		if (tasks != null && !tasks.isEmpty()) {
			ComponentName topActivity = tasks.get(0).topActivity;
			if (!topActivity.getPackageName().equals(context.getPackageName())) {
				return true;
			}
		}
		return false;
	}
	 private static final List<String> IGNORED_EXTRAS_KEYS = 
			 Arrays.asList("cn.jpush.android.TITLE","cn.jpush.android.MESSAGE","cn.jpush.android.APPKEY","cn.jpush.android.NOTIFICATION_CONTENT_TITLE");
}
